"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > اتصال gRPC بين Go وPython

اتصال gRPC بين Go وPython

تم النشر بتاريخ 2024-11-08
تصفح:199

gRPC Communication Between Go and Python

gRPC هو إطار عمل قوي وعالي الأداء لاستدعاء الإجراءات عن بعد (RPC) والذي، على الرغم من كونه أقل استخدامًا من REST، إلا أنه يوفر مزايا كبيرة في سيناريوهات معينة.

بالإضافة إلى ذلك، فهو لا يعرف اللغة ويمكن تشغيله في أي بيئة، مما يجعله خيارًا مثاليًا للاتصال من خادم إلى خادم.

لن أخوض في شرح كامل لها ولكن هنا رابط عام لـ gRPC. سأقدم لك التدريب العملي على البرنامج التعليمي

انتقل إلى عميل gRPC 

لنتخيل أن Go الخاص بنا هو عميل ولكنه خادم مثل تطبيق الواجهة الأمامية React وSvelte وما إلى ذلك.

func getFirstArg() (string, error) {
    if len(os.Args) 



gRPC Communication Between Go and Python


كمثال تقوم الواجهة الأمامية لـ React بتحميل ملف، قم بمعالجته ولكننا نحتاج إلى إجابات من Excel، وسوف نستخدم GPT API. في حين أنه يمكن القيام بذلك باستخدام Go، فإن بايثون من ناحية أخرى لديها المزيد من الحزم التي يمكن أن تسهل حياتنا مثل langchan_openai، وpandas for excel وما إلى ذلك.


لنبدأ بتثبيت gRPC ويفضل أن يكون ذلك في virtualenv .venv

$ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
$ export PATH="$PATH:$(go env GOPATH)/bin"

في الخطوة التالية، يجب عليك تثبيت المخزن المؤقت للبروتوكول في نظام التشغيل لديك، ويمكنك متابعته هنا.
لنقم بإنشاء دليل أولي حيث ستقوم بتخزين ملف المخزن المؤقت للبروتوكول الخاص بك وسأسميه باسم excel.proto وألصق هذا:

syntax = "proto3";
option go_package = "client-gRPC/proto";
service ExcelService {
    rpc UploadFile(FileRequest) returns (FileResponse);
}
message FileRequest {
    string file_name = 1;
    bytes file_content = 2;
}
message FileResponse {
    bytes file_content = 1;
}

تتيح خدمة gRPC هذه، ExcelService، للعملاء تحميل ملف عن طريق إرسال اسمه ومحتواه. يستجيب الخادم بنفس محتوى الملف. 

بالنسبة لـ Go، من الضروري تمرير go_package في Python، ليس هناك حاجة إلى السطر.

يعد vscode-proto3 امتدادًا جيدًا للتنزيل إذا كنت تستخدم VSCode.

بعد كل هذا، يمكنك إنشاء ملفاتك الأولية، أفضلها بنفس مستوى prot dir، لذلك قم بتشغيل هذا الأمر:

protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative proto/excel.proto

إذا كان يجب إنشاء ملفين ناجحين، اختياريًا إذا كان هناك الكثير من التعديلات، أضف ملف Makefile وحدده كأمر علوي أولي.

import (
    ....

    "google.golang.org/grpc"
    pb "client-gRPC/proto"
    "github.com/xuri/excelize/v2"
)

func main() {
    ....

    conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
    if err != nil {
        log.Fatalf("Failed to connect to gRPC server: %v", err)
    }
    defer conn.Close()

    client := pb.NewExcelServiceClient(conn)

    req := &pb.FileRequest{
        FileName:    filePath,
        FileContent: fileData,
    }

    res, err := client.UploadFile(context.Background(), req)
    if err != nil {
        log.Fatalf("Failed to upload file: %v", err)
    }

    outputFile := "output.xlsx"
    err = saveBytesAsExcel(outputFile, res.FileContent)
    if err != nil {
        log.Fatalf("Failed to save bytes as Excel file: %v", err)
    }

    fmt.Printf("Excel file saved as: %s\n", outputFile)
}

func saveBytesAsExcel(filePath string, fileContent []byte) error {
    f, err := excelize.OpenReader(bytes.NewReader(fileContent))
    if err != nil {
        return fmt.Errorf("failed to open Excel file: %v", err)
    }

    if err := f.SaveAs(filePath); err != nil {
        return fmt.Errorf("failed to save Excel file: %v", err)
    }
    return nil
}

قمنا بإجراء اتصال للاستماع إلى 50051 الذي سيكون خادم Python الخاص بنا، &pb.FileRequest تم إنشاؤه مسبقًا باستخدام أمر proto والآن نقوم باستيراد الأساليب. إذا قمت بتشغيل سوف تتلقى؟ بسبب عدم إنشاء خادم بايثون بعد.

Failed to upload file: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial tcp 127.0.0.1:50051: connect: connection refused"

خادم بايثون gRPC

نظرًا لأن لغة python ستعمل كخادم، فسيكون النهج مختلفًا قليلاً ولكن في جوهره، لا يلزم تقديم نفس الملف الأولي من حقل الحزمة. لنبدأ بإنشاء قاعدة main.py بدون gRPC فقط لإلقاء نظرة سريعة على كيفية قيام GPT بملء الأسئلة في Excel.

import os
import openai
import pandas as pd
from dotenv import load_dotenv

def get_answer_from_gpt(apikey: str, question: str):
    openai.api_key = apikey
    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": question}
        ]
    )
    return response['choices'][0]['message']['content'].strip()

def answer_questions_df(df: pd.DataFrame, apikey: str):
    answers = []

    for question in df.iloc[:, 0]: 
        answer = get_answer_from_gpt(apikey, question)
        answers.append(answer)
    return answers

if __name__ == "__main__":
    load_dotenv()

    openai_api_key = os.getenv("OPENAI_API_KEY", "OpenAI API key hasn't been set.")

    df = pd.read_excel('Book1.xlsx')

    df['Answer'] = answer_questions_df(df, openai_api_key

إنه برنامج نصي بسيط يجيب على الأسئلة التي سيرسلها Go إلينا ولكن LOC أقل بسبب مكتبة openai المخصصة التي تجعل الأمر أسهل.


نبدأ بإضافة proto dir بنفس الملف كما هو مذكور أعلاه، ويمكن إزالة قسم الخيارات كما تم مناقشته. يفضل تثبيت gRPC في Virtualenv الخاص بك واتبع هنا التثبيت للجيل الأولي الذي قمت بتشغيله"

python3 -m grpc_tools.protoc --proto_path=proto --python_out=proto --grpc_python_out=proto proto/excel.proto

لكي تكون في نفس مستوى الدليل الأولي الخاص بي تذكر إضافة __init.py!

الملفات التي تم إنشاؤها لنستمر.

import io
import grpc
from proto import excel_pb2_grpc as excel_grpc
from proto import excel_pb2

class ExcelService(excel_grpc.ExcelServiceServicer):
    def UploadFile(self, request, context):
        try:
            # Convert bytes to a file-like object
            file_like_object = io.BytesIO(request.file_content)

            # Load the workbook from the file-like object
            workbook = openpyxl.load_workbook(file_like_object)

            # Access the first sheet (or use appropriate logic to get the sheet you need)
            sheet = workbook.active

            # Convert the sheet to a DataFrame
            data = sheet.values
            columns = next(data)  # Get the header row
            df = pd.DataFrame(data, columns=columns)

            print("Loaded DataFrame:")
            print(df.head())

            # Ensure that the DataFrame is not empty and has questions
            if df.empty or df.shape[1] 



نقوم بتعريف الخادم وإضافة فئة ExcelService التي تحتوي على الطرق التي تم إنشاؤها بواسطة ملف proto. لأننا نتلقى الملف بالبايت، يجب علينا استخدام قارئ io byte والبدء في معالجة الملف وملء العمود الثاني.

response = excel_pb2.FileResponse(file_content=output.read())

في النهاية نعود ☝️ ليستلمها عميلنا Go.

لتتمكن من العثور على ملفات أولية في بايثون، يجب عليك تحديد مسار التصدير

تصدير PYTHONPATH=$PYTHONPATH:mnt/c/own_dev/gRPC/server/proto

تشغيل العميل والخادم

If all is good you can run

#First comes server

python3 -m main

#Then client

go run client.go Book1.xlsx

ومن المفترض أن تحصل على ملف xlsx. المحدث في جانب عميل Go.

خاتمة

استكشفنا في هذه المقالة أساسيات إعداد اتصال gRPC بين خادم Python وعميل Go. من خلال الاستفادة من gRPC، أنشأنا طريقة سلسة لإرسال ملف Excel من تطبيق Go إلى خادم Python، ومعالجة الملف باستخدام OpenAI's GPT API، وإعادة الملف المعدل مرة أخرى إلى عميل Go.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/mozes721/grpc-communication-between-go-and-python-40i3?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3